package javacroft.view.GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import javacroft.facade.Facade;
import javacroft.view.MouseOverHintManager;
import javacroft.view.MyPanel;
import javacroft.view.ViewIF;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeSelectionModel;


public class StructureEnseignement extends JFrame implements ViewIF, ActionListener
{

   Facade myControlleur;
   Principale myAccueil;
   Toolkit tk;
   Dimension ecran;
   MouseOverHintManager hintManager;
   JMenuItem Importer, Exporter, Quitter, Support, APropos;
   MyPanel Fond;
   JPanel conteneur;
   GridBagConstraints contrainte;
   JPanel structures;
   JScrollPane ascenseur;
   JTextArea labelBulle;
   Font police = new Font("Serif", 0, 20);
   Font policeBulle = new Font("Serif", 0, 12);
   JLayeredPane superpoz = new JLayeredPane();
   JLabel sablier = new JLabel();
   JTree myTree;

   public StructureEnseignement(Facade unControlleur, Principale uneAccueil)
   {
      super("Consultation des structures d'enseignement");
      myControlleur = unControlleur;
      unControlleur.setView((ViewIF) this);
      this.myAccueil = uneAccueil;

      tk = Toolkit.getDefaultToolkit();
      ecran = tk.getScreenSize();

      contrainte = new GridBagConstraints();

      labelBulle = new JTextArea();
      labelBulle.setEditable(false);
      labelBulle.setFont(policeBulle);
      labelBulle.setFont(labelBulle.getFont().deriveFont(Font.BOLD));
      hintManager = new MouseOverHintManager(new JLabel(), labelBulle);

      //Nouveau = new JMenuItem("Nouveau");
      Importer = new JMenuItem("Importer");
      Exporter = new JMenuItem("Exporter");
      //Enregistrer = new JMenuItem("Enregistrer");
      Quitter = new JMenuItem("Quitter");
      Support = new JMenuItem("Support");
      APropos = new JMenuItem("A Propos");

      Fond = new MyPanel("ecran8.jpg", 1024, 768);
      Fond.setLayout(new FlowLayout(0, 10, 0));
      conteneur = new JPanel();
      conteneur.setLayout(new GridBagLayout());

      //**Menu fichier
      //Nouveau.setActionCommand("Nouveau");
      //Nouveau.addActionListener(this);
      Importer.setActionCommand("Importer");
      Importer.addActionListener(this);
      Exporter.setActionCommand("Exporter");
      Exporter.addActionListener(this);
      //Enregistrer.setActionCommand("Valider");
      //Enregistrer.addActionListener(this);
      Quitter.setActionCommand("Quitter");
      Quitter.addActionListener(this);
      JMenu menuFichier = new JMenu("Fichier");
      //menuFichier.add(Nouveau);
      menuFichier.add(Importer);
      menuFichier.add(Exporter);
      //menuFichier.add(Enregistrer);
      menuFichier.add(Quitter);

      //**Menu aide
      Support.setActionCommand("Support");
      Support.addActionListener(this);
      JMenu menuAide = new JMenu("Aide");
      menuAide.add(Support);

      //**Menu A Propos
      APropos.setActionCommand("APropos");
      APropos.setPreferredSize(new Dimension(50, 20));
      APropos.addActionListener(this);

      //**barre des menus
      JMenuBar barreMenu = new JMenuBar();
      barreMenu.add(menuFichier);
      barreMenu.add(menuAide);
      barreMenu.add(APropos);

      //hintManager.addHintFor(boxDepartements, "Selectionez le département pour lequel vous voulez entrer des notes.");

      
      labelBulle.setLineWrap(true);
      labelBulle.setWrapStyleWord(true);
      labelBulle.setPreferredSize(new Dimension(300, 120));
      labelBulle.setBorder(BorderFactory.createTitledBorder("Infos..."));
      

      //hintManager.addHintFor(conteneur, "Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
      conteneur.setSize(new Dimension(800, 600));
      Fond.add(conteneur);
      Fond.setSize(new Dimension(800, 600));
      superpoz.setPreferredSize(new Dimension(800, 600));
      superpoz.add(Fond);

      sablier.setOpaque(false);
      sablier.setSize(new Dimension(800, 600));
      //sablier.setIcon(new ImageIcon(this.getClass().getResource("sablier1.gif")));
      sablier.setBounds(380, 200, 160, 120);
      superpoz.add(sablier);
      superpoz.moveToFront(sablier);

      add(superpoz);
      setJMenuBar(barreMenu);
      hintManager.enableHints(this);
      setLocation(ecran.width / 2 - 400, ecran.height / 2 - 300);
      setSize(new Dimension(800, 600));
      setResizable(false);
      setLayout(new FlowLayout(0, 0, 0));
      setVisible(true);
      structures = new JPanel(new BorderLayout());
      structures.setPreferredSize(new Dimension(790,550));
      
      structures.setOpaque(false);
      contrainte.gridx = 0;
      contrainte.gridy = 0;
      contrainte.gridwidth = 1;
      contrainte.gridy = 2;
      contrainte.anchor = GridBagConstraints.NORTHWEST;
      conteneur.add(structures);
      this.addWindowListener(new WindowAdapter()
      {
         /**
          * cette petite fonction nous permet de spécifier l'action effectuée lorsqu'on clique sur la croix.
          * Ici, on réduit la fenetre courante et on affiche la fenetre d'accueil
          */
         public void windowClosing(WindowEvent we)
         {
            ((StructureEnseignement) we.getSource()).myAccueil.setVisible(true);
            ((StructureEnseignement) we.getSource()).setVisible(false);
         }
      });
      labelBulle.setOpaque(false);
      conteneur.setOpaque(false);
      try
      {
         Iterator iterDept = myControlleur.getLesDepartementsView().iterator();
         if (iterDept.hasNext())
         {            
            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Polytech");
            int compteurDept = 0;
            while (iterDept.hasNext())
            {
               DefaultMutableTreeNode deptNode = new DefaultMutableTreeNode((String) iterDept.next());
               rootNode.add(deptNode);
               myControlleur.updateStructure(compteurDept, -1, -1, -1, -1);
               Iterator iterAnnee = myControlleur.getLesAnneesView().iterator();               
               if (iterAnnee.hasNext())
               {
                  int compteurAnnee = 0;
                  while (iterAnnee.hasNext())
                  {
                     DefaultMutableTreeNode anneeNode = new DefaultMutableTreeNode((String) iterAnnee.next());
                     deptNode.add(anneeNode);
                     myControlleur.updateStructure(compteurDept, compteurAnnee, -1, -1, -1);
                     Iterator iterSem = myControlleur.getLesSemestresView().iterator();
                     if (iterSem.hasNext())
                     {
                        int compteurSem = 0;
                        while (iterSem.hasNext())
                        {
                           DefaultMutableTreeNode semNode = new DefaultMutableTreeNode("Semestre " + (String) iterSem.next());
                           anneeNode.add(semNode);
                           myControlleur.updateStructure(compteurDept, compteurAnnee, compteurSem, -1, -1);
                           Iterator iterUE = myControlleur.getLesUEView().iterator();
                           if (iterUE.hasNext())
                           {
                              int compteurUE = 0;
                              while (iterUE.hasNext())
                              {
                                 DefaultMutableTreeNode UENode = new DefaultMutableTreeNode((String) iterUE.next());
                                 semNode.add(UENode);
                                 myControlleur.updateStructure(compteurDept, compteurAnnee, compteurSem, compteurUE, -1);
                                 Iterator iterECUE = myControlleur.getLesECUEView().iterator();
                                 if (iterECUE.hasNext())
                                 {
                                    while (iterECUE.hasNext())
                                    {
                                       DefaultMutableTreeNode ECUENode = new DefaultMutableTreeNode((String) iterECUE.next());
                                       UENode.add(ECUENode);
                                    }
                                 }
                                 compteurUE = compteurUE + 1;
                              }
                           }
                           compteurSem = compteurSem + 1;
                        }
                     }
                     compteurAnnee = compteurAnnee + 1;
                  }
               }
               compteurDept = compteurDept + 1;
            }
            myTree = new JTree(rootNode);
            DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer()
            {
             public Color getBackgroundNonSelectionColor()
             {
                 return(null);
             }

             public Color getBackground()
             {
                 return(null);
             }
            };

            myTree.setCellRenderer(renderer);
            myTree.setOpaque(false);
            myTree.setFont(police);
            myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            ascenseur = new JScrollPane(myTree);
            ascenseur.setOpaque(false);
            ascenseur.getViewport().setOpaque(false);
            ascenseur.setPreferredSize(new Dimension(780,550));
            structures.add(ascenseur,BorderLayout.CENTER);

            /*contrainte.gridx = 1;
            contrainte.gridy = 1;
            contrainte.gridheight = 1;
            contrainte.gridwidth = 1;
            contrainte.anchor = GridBagConstraints.SOUTH;
            conteneur.add(labelBulle, contrainte);
            labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
            //boxDepartements.addActionListener(this);
            //boxDepartements.setEnabled(true);*/
         }
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
         display(ex.toString());
      }
      finally
      {
         superpoz.moveToFront(Fond);
      }
   }

   public void actionPerformed(ActionEvent e)
   {
      
      if (e.getActionCommand().equals("Valider"))
      {
         try
         {
            
         }
         catch (Exception ex)
         {
            
         }
      }
      else if (e.getActionCommand().equals("Quitter"))
      {
         myAccueil.setVisible(true);
         this.setVisible(false);
      }
      else if (e.getActionCommand().equals("Importer") || e.getActionCommand().equals("Exporter"))
      {
         display("Les fonction Importer/Exporter ne sont pas encore implémentée !!!");
      }      
      else if (e.getActionCommand().equals("APropos"))
      {
         textAPropos();
      }
      else if (e.getActionCommand().equals("Support"))
      {
         aide();
      }  
   }

   

   public final void display(String message)
   {
      JOptionPane.showMessageDialog(this, message);
   }

   public void textAPropos()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 400));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Bonjour et Bienvenue dans le module de consultation des Structures d'enseignement des Etudiants de Polytech Montpellier !\nUtilisation du module:\n\n");
      jtA.setText(jtA.getText() + "Vous avez devant vous un arbre des structures. Il vous suffit de cliquer sur un noeud de l'arbre pour voir les sous structures correspondantes.");
      jtA.setText(jtA.getText() + "S'il n'y a pas de sous structure, l'icone ne sera pas la même. Elle ressemble à un fichier.");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }

   public void aide()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 200));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Un problème ? Ce serait étonnant mais bon. Consultez le menu \" A Propos\".\nSi cela ne vous a pas aidé, contactez notre équipe ! ;-)");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }
}
